package com.eugenema.util.DemandUtil;

import com.alibaba.fastjson.JSON;
import com.eugenema.entity.TestStep;
import com.eugenema.service.RunSeleniumService;
import com.eugenema.util.ConfigUtil;
import com.eugenema.util.SeleniumUtil;
import org.openqa.selenium.WebElement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
/**
 * <p>标题：在线文档操作工具类</p>
 * <p>
 *  功能：包含各个需求中需要操作在线文档的公共方法
 * </p>
 * <p>其他说明：</p>
 * <p>作者：马寅广</p>
 * <p>审核：</p>
 * <p>重构：</p>
 * <p>创建日期：2024/1/4 20:56</p>
 */
public class OnlineFileUtil {
    /** 日志 */
    private static Logger logger = LoggerFactory.getLogger(OnlineFileUtil.class);
    /** wps 在线文档登录界面 */
    public static final String LOGIN_URL = "https://account.wps.cn/";
    /* 操作工具页面 **/
    public static final String OPERATE_HTML = "file:///" + ConfigUtil.CONFIG_PATH + "inputExcel/index.html";

    /**
     * 获取在线文档链接
     *
     * @author 马寅广
     * @date 2024/1/4 20:58
     *
     * @param propertyKey 配置文档的 key
     * @param demandName 需求名称
     *
     * @return 在线文档链接，获取失败会返空
     **/
    public static String getOnlineFileLink(String propertyKey, String demandName) {
        String onlineFileLink = ConfigUtil.getProperty(propertyKey);
        if (onlineFileLink == null || onlineFileLink.isEmpty()) {
            logger.error("【{}】失败：获取在线文档链接失败，请检查配置文件！", demandName);
            return null;
        }
        return onlineFileLink;
    }

    /**
     * 登录在线文档
     *
     * @author 马寅广
     * @date 2024/1/4 21:09
     *
     * @param service 脚本服务
     *
     * @return 执行结果
     **/
    public static boolean login(RunSeleniumService service) {
        // 1、打开登录界面
        TestStep step_1 = service.getStep("step_1");
        step_1.setValue(LOGIN_URL);
        service.runStep(step_1);

        // 2、检查是否登录成功
        try {
            service.runStep("step_12");
        } catch (Exception e) {
            // 登录失败
            TestStep step_13 = service.getStep("step_13");
            step_13.setValue("登录失败，请手动登录后重新尝试！");
            service.runStep(step_13);
            logger.error("登录失败，请手动登录后重新尝试！");
            return false;
        }
        return true;
    }

    /**
     * 加载要处理的在线文档
     *
     * @author 马寅广
     * @date 2024/1/4 21:58
     *
     * @param service 脚本服务
     * @param onlineFileLink 要处理的在线文档链接
     *
     * @return 执行结果
     **/
    public static boolean load(RunSeleniumService service, String onlineFileLink) {
        // 打开共享文档
        TestStep step_1 = service.getStep("step_1");
        step_1.setValue(OPERATE_HTML);
        service.runStep(step_1);

        // 加载数据，并检查是否获取表格数据成功
        TestStep step_17 = service.getStep("step_17");
        step_17.setValue("fileLoad('" + onlineFileLink + "')");
        service.runStep(step_17);
        try {
            service.runStep("step_14");
        } catch (Exception e) {
            // 获取数据失败
            logger.error(service.getStep("step_14").getMessage());
            return false;
        }
        return true;
    }

    /**
     * 获取需要处理的目标球队数据
     *
     * @author 马寅广
     * @date 2024/1/4 21:57
     *
     * @param service 脚本服务
     *
     * @return 需要处理的目标球队数据
     **/
    public static List<List<String>> getTargetTeamInfo(RunSeleniumService service) {
        logger.info("获取需要处理的目标球队信息……");
        // 获取目标球队数据(List(时间、目标球队链接、目标球队名称)))
        service.runStep("step_15");
        List<List<String>> startData = (List<List<String>>) SeleniumUtil.globalMap.get("step_15");
        return startData;
    }

    /**
     * 获取指定球队的数据
     * <br/> 若是 a 标签，则会依次填入 a 标签体、超链接
     * <br/> 其余标签均只获取标签体
     *
     * @author 马寅广
     * @date 2024/1/4 22:13
     *
     * @param service 脚本服务
     * @param teamLink 球队链接
     * @param xPath 获取数据的 xpath
     * @param desc 数据描述
     *
     * @return 数据
     **/
    public static List<String> getInfo(RunSeleniumService service, String teamLink, String xPath, String desc) {
        /** 比赛数据 */
        List<String> matchData = new ArrayList<>();

        // 跳转球队首页
        TestStep step_1 = service.getStep("step_1");
        step_1.setValue(teamLink);
        service.runStep(step_1);

        // 获取比赛的数据
        TestStep step_16 = service.getStep("step_16");
        step_16.setValue(xPath);
        step_16.setDesc(desc);
        service.runStep(step_16);
        List<WebElement> wqMatchInfo = (List<WebElement>) SeleniumUtil.globalMap.get("step_16");
        for (WebElement webElement : wqMatchInfo) {
            matchData.add(webElement.getText());
            String tagName = webElement.getTagName();
            switch (tagName) {
                case "a": {
                    matchData.add(webElement.getAttribute("href"));
                    break;
                }
            }
        }
        return matchData;
    }

    /**
     * 处理数据
     *
     * @author 马寅广
     * @date 2024/1/4 22:33
     *
     * @param service 脚本服务
     * @param methodName 要执行回填的方法
     * @param data 回填的数据
     *
     * @return 执行结果
     **/
    public static boolean dealData(RunSeleniumService service, String methodName, Object data) {
        // 调用回填方法
        TestStep step_17 = service.getStep("step_17");
        String dataJson = JSON.toJSONString(data);
        step_17.setValue("let data = '" + dataJson + "'; " + methodName + "(data)");
        service.runStep(step_17);

        // 等待数据处理完成
        try {
            service.runStep("step_18");
        } catch (Exception e) {
            // 获取数据失败
            logger.error(service.getStep("step_18").getMessage());
            return false;
        }
        return true;
    }
}
